<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>7.11. Using a Conventional Modular Directory Structure</title>
<link rel="stylesheet" href="dbstyle.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.72.0">
<link rel="start" href="index.html" title="Programmer's Reference Guide">
<link rel="up" href="zend.controller.html" title="Chapter 7. Zend_Controller">
<link rel="prev" href="zend.controller.plugins.html" title="7.10. Plugins">
<link rel="next" href="zend.controller.exceptions.html" title="7.12. MVC Exceptions">
<link rel="chapter" href="introduction.html" title="Chapter 1. Introduction to Zend Framework">
<link rel="chapter" href="zend.acl.html" title="Chapter 2. Zend_Acl">
<link rel="chapter" href="zend.auth.html" title="Chapter 3. Zend_Auth">
<link rel="chapter" href="zend.cache.html" title="Chapter 4. Zend_Cache">
<link rel="chapter" href="zend.config.html" title="Chapter 5. Zend_Config">
<link rel="chapter" href="zend.console.getopt.html" title="Chapter 6. Zend_Console_Getopt">
<link rel="chapter" href="zend.controller.html" title="Chapter 7. Zend_Controller">
<link rel="chapter" href="zend.currency.html" title="Chapter 8. Zend_Currency">
<link rel="chapter" href="zend.date.html" title="Chapter 9. Zend_Date">
<link rel="chapter" href="zend.db.html" title="Chapter 10. Zend_Db">
<link rel="chapter" href="zend.debug.html" title="Chapter 11. Zend_Debug">
<link rel="chapter" href="zend.dojo.html" title="Chapter 12. Zend_Dojo">
<link rel="chapter" href="zend.dom.html" title="Chapter 13. Zend_Dom">
<link rel="chapter" href="zend.exception.html" title="Chapter 14. Zend_Exception">
<link rel="chapter" href="zend.feed.html" title="Chapter 15. Zend_Feed">
<link rel="chapter" href="zend.filter.html" title="Chapter 16. Zend_Filter">
<link rel="chapter" href="zend.form.html" title="Chapter 17. Zend_Form">
<link rel="chapter" href="zend.gdata.html" title="Chapter 18. Zend_Gdata">
<link rel="chapter" href="zend.http.html" title="Chapter 19. Zend_Http">
<link rel="chapter" href="zend.infocard.html" title="Chapter 20. Zend_InfoCard">
<link rel="chapter" href="zend.json.html" title="Chapter 21. Zend_Json">
<link rel="chapter" href="zend.layout.html" title="Chapter 22. Zend_Layout">
<link rel="chapter" href="zend.ldap.html" title="Chapter 23. Zend_Ldap">
<link rel="chapter" href="zend.loader.html" title="Chapter 24. Zend_Loader">
<link rel="chapter" href="zend.locale.html" title="Chapter 25. Zend_Locale">
<link rel="chapter" href="zend.log.html" title="Chapter 26. Zend_Log">
<link rel="chapter" href="zend.mail.html" title="Chapter 27. Zend_Mail">
<link rel="chapter" href="zend.measure.html" title="Chapter 28. Zend_Measure">
<link rel="chapter" href="zend.memory.html" title="Chapter 29. Zend_Memory">
<link rel="chapter" href="zend.mime.html" title="Chapter 30. Zend_Mime">
<link rel="chapter" href="zend.openid.html" title="Chapter 31. Zend_OpenId">
<link rel="chapter" href="zend.paginator.html" title="Chapter 32. Zend_Paginator">
<link rel="chapter" href="zend.pdf.html" title="Chapter 33. Zend_Pdf">
<link rel="chapter" href="zend.registry.html" title="Chapter 34. Zend_Registry">
<link rel="chapter" href="zend.rest.html" title="Chapter 35. Zend_Rest">
<link rel="chapter" href="zend.search.lucene.html" title="Chapter 36. Zend_Search_Lucene">
<link rel="chapter" href="zend.server.html" title="Chapter 37. Zend_Server">
<link rel="chapter" href="zend.service.html" title="Chapter 38. Zend_Service">
<link rel="chapter" href="zend.session.html" title="Chapter 39. Zend_Session">
<link rel="chapter" href="zend.soap.html" title="Chapter 40. Zend_Soap">
<link rel="chapter" href="zend.test.html" title="Chapter 41. Zend_Test">
<link rel="chapter" href="zend.text.html" title="Chapter 42. Zend_Text">
<link rel="chapter" href="zend.timesync.html" title="Chapter 43. Zend_TimeSync">
<link rel="chapter" href="zend.translate.html" title="Chapter 44. Zend_Translate">
<link rel="chapter" href="zend.uri.html" title="Chapter 45. Zend_Uri">
<link rel="chapter" href="zend.validate.html" title="Chapter 46. Zend_Validate">
<link rel="chapter" href="zend.version.html" title="Chapter 47. Zend_Version">
<link rel="chapter" href="zend.view.html" title="Chapter 48. Zend_View">
<link rel="chapter" href="zend.xmlrpc.html" title="Chapter 49. Zend_XmlRpc">
<link rel="appendix" href="requirements.html" title="Appendix A. Zend Framework Requirements">
<link rel="appendix" href="coding-standard.html" title="Appendix B. Zend Framework Coding Standard for PHP">
<link rel="appendix" href="copyrights.html" title="Appendix C. Copyright Information">
<link rel="index" href="the.index.html" title="Index">
<link rel="subsection" href="zend.controller.modular.html#zend.controller.modular.introduction" title="7.11.1. Introduction">
<link rel="subsection" href="zend.controller.modular.html#zend.controller.modular.directories" title="7.11.2. Specifying Module Controller Directories">
<link rel="subsection" href="zend.controller.modular.html#zend.controller.modular.router" title="7.11.3. Routing to modules">
<link rel="subsection" href="zend.controller.modular.html#zend.controller.modular.defaultcontroller" title="7.11.4. Module or Global Default Controller">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader"><table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">7.11. Using a Conventional Modular Directory Structure</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="zend.controller.plugins.html">Prev</a> </td>
<th width="60%" align="center">Chapter 7. Zend_Controller</th>
<td width="20%" align="right"> <a accesskey="n" href="zend.controller.exceptions.html">Next</a>
</td>
</tr>
</table></div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="zend.controller.modular"></a>7.11. Using a Conventional Modular Directory Structure</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.controller.modular.introduction"></a>7.11.1. Introduction</h3></div></div></div>
<p>
            The Conventional Modular directory structure allows you to separate
            different MVC applications into self-contained units, and re-use
            them with different front controllers. To illustrate such a
            directory structure:
        </p>
<pre class="programlisting">
docroot/
    index.php
application/
    default/
        controllers/
            IndexController.php
            FooController.php
        models/
        views/
            scripts/
                index/
                foo/
            helpers/
            filters/
    blog/
        controllers/
            IndexController.php
        models/
        views/
            scripts/
                index/
            helpers/
            filters/
    news/
        controllers/
            IndexController.php
            ListController.php
        models/
        views/
            scripts/
                index/
                list/
            helpers/
            filters/
        </pre>
<p>
            In this paradigm, the module name serves as a prefix to the
            controllers it contains. The above example contains three
            module controllers, 'Blog_IndexController', 'News_IndexController', and
            'News_ListController'. Two global controllers, 'IndexController' and
            'FooController' are also defined; neither of these will be
            namespaced. This directory structure will be used for examples in
            this chapter.
        </p>
<div class="note"><table border="0" summary="Note: No namespacing in the default module">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td>
<th align="left">No namespacing in the default module</th>
</tr>
<tr><td align="left" valign="top"><p>
                Note that in the default module, controllers do not need a
                namespace prefix. Thus, in the example above, the controllers in
                the default module do not need a prefix of 'Default_' -- they
                are simply dispatched according to their base controller name:
                'IndexController' and 'FooController'. A namespace prefix is
                used in all other modules, however.
            </p></td></tr>
</table></div>
<p>
            So, how do you implement such a directory layout using the Zend
            Framework MVC components?
        </p>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.controller.modular.directories"></a>7.11.2. Specifying Module Controller Directories</h3></div></div></div>
<p>
            The first step to making use of modules is to modify how you specify
            the controller directory list in the front controller. In the basic
            MVC series, you pass either an array or a string to
            <code class="code">setControllerDirectory()</code>, or a path to
            <code class="code">addControllerDirectory()</code>.  When using modules, you need
            to alter your calls to these methods slightly.
        </p>
<p>
            With <code class="code">setControllerDirectory()</code>, you will need to pass an
            associative array and specify key/value pairs of module
            name/directory paths.  The special key <code class="code">default</code> will be
            used for global controllers (those not needing a module namespace).
            All entries should contain a string key pointing to a single path,
            and the <code class="code">default</code> key must be present. As an example:
        </p>
<pre class="programlisting">&lt;?php
$front-&gt;setControllerDirectory(array(
      'default' =&gt; '/path/to/application/controllers',
      'blog'    =&gt; '/path/to/application/blog/controllers'
));
        </pre>
<p>
            <code class="code">addControllerDirectory()</code> will take an optional second
            argument. When using modules, pass the module name as the second
            argument; if not specified, the path will be added to the
            <code class="code">default</code> namespace. As an example:
        </p>
<pre class="programlisting">&lt;?php
$front-&gt;addControllerDirectory('/path/to/application/news/controllers', 'news');
        </pre>
<p>
            Saving the best for last, the easiest way to specify module
            directories is to do so en masse, with all modules under a common
            directory and sharing the same structure. This can be done with
            <code class="code">addModuleDirectory()</code>:
        </p>
<pre class="programlisting">&lt;?php
/**
 * Assuming the following directory structure:
 * application/
 *     modules/
 *         default/
 *             controllers/
 *         foo/
 *             controllers/
 *         bar/
 *             controllers/
 */
$front-&gt;addModuleDirectory('/path/to/application/modules');
        </pre>
<p>
            The above example will define the <code class="code">default</code>,
            <code class="code">foo</code>, and <code class="code">bar</code> modules, each pointing to the
            <code class="code">controllers</code> subdirectory of their respective module.
        </p>
<p>
            You may customize the controller subdirectory to use within your
            modules by using <code class="code">setModuleControllerDirectoryName()</code>:
        </p>
<pre class="programlisting">&lt;?php
/**
 * Change the controllers subdirectory to be 'con'
 * application/
 *     modules/
 *         default/
 *             con/
 *         foo/
 *             con/
 *         bar/
 *             con/
 */
$front-&gt;setModuleControllerDirectoryName('con');
$front-&gt;addModuleDirectory('/path/to/application/modules');
        </pre>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
            You can indicate that no controller subdirectory be used for your
            modules by passing an empty value to
            <code class="code">setModuleControllerDirectoryName()</code>.
        </p></td></tr>
</table></div>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.controller.modular.router"></a>7.11.3. Routing to modules</h3></div></div></div>
<p>
            The default route in <code class="code">Zend_Controller_Router_Rewrite</code> is
            an object of type <code class="code">Zend_Controller_Router_Route_Module</code>.
            This route expects one of the following routing schemas:
        </p>
<div class="itemizedlist"><ul type="disc">
<li><p><code class="code">:module/:controller/:action/*</code></p></li>
<li><p><code class="code">:controller/:action/*</code></p></li>
</ul></div>
<p>
            In other words, it will match a controller and action by themselves
            or with a preceding module. The rules for matching specify that a
            module will only be matched if a key of the same name exists in the
            controller directory array passed to the front controller and
            dispatcher.
        </p>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.controller.modular.defaultcontroller"></a>7.11.4. Module or Global Default Controller</h3></div></div></div>
<p>
            In the default router, if a controller was not specified in the URL,
            a default controller is used (<code class="code">IndexController</code>, unless
            otherwise requested). With modular controllers, if a module has been
            specified but no controller, the dispatcher first looks for this
            default controller in the module path, and then falls back on the
            default controller found in the 'default', global, namespace.
        </p>
<p>
            If you wish to always default to the global namespace, set the
            <code class="code">useDefaultControllerAlways</code> parameter in the front controller:
        </p>
<pre class="programlisting">&lt;?php
$front-&gt;setParam('useDefaultControllerAlways', true);
        </pre>
</div>
</div>
<div class="navfooter"><table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="zend.controller.plugins.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="zend.controller.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="zend.controller.exceptions.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">7.10. Plugins </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> 7.12. MVC Exceptions</td>
</tr>
</table></div>
<div class="revinfo"></div>
</body>
</html>
